package com.wangyf.thread2;

import java.util.concurrent.*;

/**
 * 创建线程的5种方式，实际就是1种
 * 1.继承Thread
 * 2.实现runnable接口
 * 3.lambda表达式
 * 4.线程池
 * 5.带返回值的
 * @author wangyf
 * @date 2021/7/8 19:34
 */
public class T02_HowToCreateThread {
    static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Hello MyThread!");
        }
    }

    static class MyRun implements Runnable {
        @Override
        public void run() {
            System.out.println("Hello MyRun!");
        }
    }

    static class MyCall implements Callable<String> {// 可以定义泛型来设置返回值类型
        @Override
        public String call() {// 注意是call方法
            System.out.println("Hello MyCall");
            return "success";
        }
    }

    //启动线程的5种方式
    public static void main(String[] args) throws Exception {
        new MyThread().start();
        new Thread(new MyRun()).start();
        new Thread(() -> {
            System.out.println("Hello Lambda!");
        }).start();

        //4.线程池
        ExecutorService service = Executors.newCachedThreadPool();
        service.execute(() -> {
            System.out.println("Hello ThreadPool");
        });

        // 5.带返回值的 future 未来的 ，submit为异步方法，不会等到这个线程有返回值才向下执行
        Future<String> f = service.submit(new MyCall());
        String s = f.get();// 所以get为阻塞方法
        System.out.println(s);
        service.shutdown();
        // 5.2
        FutureTask<String> task = new FutureTask<>(new MyCall());
        Thread t = new Thread(task);
        t.start();
        System.out.println(task.get());

    }
}
